// import { Parent } from '@interface/user'
// import { userMunStron } from '@store/userMunStore'
// import router from './index'

// // 前置
// export const beforeEach = (to) => {
//   // 判断当前页面是不是login页面
//   if (to.path == '/login') {
//     return
//   }
//   if (!localStorage.getItem('token')) {
//     return '/login'
//   }

//   //动态添加路由函数
//   initRouter()
//   if (to.matched.length == 0) {
//     router.push(to.fullpath)
//   }
//   return true
// }

// // 动态添加路由过程
// const initRouter = () => {
//   const Mun: Parent[] = userMunStron().userMun
//   let munRouter = filterRouter(Mun)
//   munRouter = flatRoutes(munRouter)
//   console.log(munRouter)
//   munRouter.forEach((item) => {
//     console.log(item.parentview)

//     router.addRoute(item.parentview == 'layout' ? 'layout' : '', item)
//   })
// }
// interface child {
//   parentview: string
//   name: string
//   path: string
//   meta: any
//   redirect: string
//   children: child[] | null
//   component: any
// }
// // 将Component重构成箭头函数形式
// const filterRouter = (Mun: Parent[]) => {
//   const arrayrouter: child[] = []
//   Mun.forEach((item: Parent) => {
//     var route = {
//       name: item.name,
//       path: item.path,
//       meta: item.meta,
//       parentview: item.parentView,
//       redirect: item.redirect,
//       children: item.children ? filterRouter(item.children) : null,
//       component: loadingComponent(item.component)
//     }
//     arrayrouter.push(route)
//   })
//   return arrayrouter
// }
// // import.meta.glob是Vite提供的一个方法，用于匹配文件路径。参数是字符串，里面使用了Glob模式。这里的模式是'@renderer/view/**/*.vue'，其中**表示任意子目录，*表示任意文件名，所以这个模式会匹配@renderer/view目录及其所有子目录下的.vue文件。
// // import.meta.glob返回的是一个对象，键是匹配到的文件路径，值是一个返回Promise的函数，调用该函数会动态导入对应的模块。例如：
// // 对于Component的调整
// const modules = import.meta.glob('@renderer/view/**/*.vue')
// console.log(modules)
// const modulesMap = {}
// // Object.keys(modules)其作用是返回一个由给定对象的所有可枚举属性组成的数组，数组中的元素为对象属性名（字符串类型）。
// Object.keys(modules).forEach((key) => {
//   const ComponentName = key
//     .replace('@renderer/view', '')
//     .replace('/src/view/', '')
//     .replace('.vue', '')
//     .replace('/index', '')
//   console.log(ComponentName)
//   if (key.includes('index')) {
//     modulesMap[`${ComponentName}/index`] = modules[key]
//   }
//   modulesMap[ComponentName] = modules[key]
// })
// // 根据modulesmap[key]返回对应的value值
// const loadingComponent = (component: string | null) => {
//   if (component) {
//     return modulesMap[component]
//   }
// }
// //扁平化操作 扁平化处理
// const flatRoutes = (routes: Child[], breadcrumb: Child[] = []): Child[] => {
//   let res: Child[] = []
//   const cloneRouters = clone()(routes)
//   cloneRouters.forEach((route: Child) => {
//     const tmp = { ...route }
//     if (tmp.children) {
//       let childrenBreadcrumb: Child[] = [...breadcrumb]
//       childrenBreadcrumb.push(route)
//       let tmpRoute = { ...route }
//       tmpRoute.meta.breadcrumb = childrenBreadcrumb
//       delete tmpRoute.children
//       res.push(tmpRoute)
//       let childrenRoutes = flatRoutes(tmp.children, childrenBreadcrumb)
//       childrenRoutes.map((item) => {
//         res.push(item)
//       })
//     } else {
//       let tmpBreadcrumb = [...breadcrumb]
//       tmp.meta.breadcrumb = tmpBreadcrumb
//       tmpBreadcrumb.push(tmp)
//       res.push(tmp)
//     }
//   })
//   return res
// }
// // 后置
// export const afterEach = () => {
//   console.log('后置')
//   // return true
// }

import { userMunStron } from '@store/userMunStore'
import router from '@router'
// // 深度出库对象 并处理循环引用
import clone from 'rfdc'
import { Parent } from '@interface/user'

export const beforeEach = (to: any) => {
  if (to.path == '/login') {
    return
  }

  if (!localStorage.getItem('token')) {
    return '/login'
  }
  //动态添加路由
  initRouter()

  //当前路由没有匹配到任何路由记录
  if (to.matched.length == 0) {
    router.push(to.fullPath)
  }
  return true
}

interface Child {
  parentView: string
  path: string
  name: string
  meta: any
  redirect: string
  children?: Child[] | null
  component: any
  id?: string | undefined
  hidden?: boolean | undefined
  alwaysShow?: boolean | undefined
  query?: string | undefined
}

interface Child extends Omit<Parent, 'children'> {
  children?: Child[] | null
}

//1. 动态添加路由 => 整个过程
const initRouter = () => {
  let menu: Parent[] = userMunStron().userMun
  let menuRouter: Child[] = filterRouter(menu)
  menuRouter = flatRoutes(menuRouter)
  menuRouter.forEach((item) => {
    if (item.parentView && item.path) {
      router.addRoute(item.parentView == 'layout' ? 'layout' : '', item)
    }
  })
}

//2. 把component 重构成 箭头函数的形式
const filterRouter = (menu: Parent[]): Child[] => {
  const arrRouter: Child[] = []
  menu.forEach((item: any) => {
    var route: Child = {
      parentView: item.parentView,
      path: item.path,
      name: item.name,
      meta: item.meta,
      redirect: item.redirect,
      children: item.children ? filterRouter(item.children) : null,
      component: loadComponent(item.component)
    }
    arrRouter.push(route)
  })
  return arrRouter
}

//3. 对于component的调整
const modules: Record<string, () => Promise<any>> = import.meta.glob('@renderer/view/**/*.vue')
const modulesMap: Record<string, () => Promise<any>> = {}
Object.keys(modules).forEach((key) => {
  const componentName = key
    .replace('@renderer/view', '')
    .replace('/src/view/', '')
    .replace('.vue', '')
    .replace('/index', '')
  if (key.includes('index')) {
    modulesMap[`${componentName}/index`] = modules[key]
  }
  modulesMap[componentName] = modules[key]
  // console.log(modulesMap[componentName])
})

//4. 根据modulesMap[key]返回对应的value值
const loadComponent = (component: string | null): (() => Promise<any>) | undefined => {
  if (component) {
    return modulesMap[component]
  }
  return
}
//5. 路由扁平化
const flatRoutes = (routes: Child[], breadcrumb: Child[] = []): Child[] => {
  const res: Child[] = []
  const cloneRouters = clone()(routes)
  cloneRouters.forEach((route: Child) => {
    const tmp = { ...route }
    if (tmp.children) {
      const childrenBreadcrumb: Child[] = [...breadcrumb]
      childrenBreadcrumb.push(route)
      const tmpRoute = { ...route }
      tmpRoute.meta.breadcrumb = childrenBreadcrumb
      delete tmpRoute.children
      res.push(tmpRoute)
      const childrenRoutes = flatRoutes(tmp.children, childrenBreadcrumb)
      childrenRoutes.map((item) => {
        res.push(item)
      })
    } else {
      let tmpBreadcrumb = [...breadcrumb]
      tmpBreadcrumb.push(tmp)
      tmp.meta.breadcrumb = tmpBreadcrumb
      res.push(tmp)
    }
  })
  return res
}

//后置
export const afterEach = () => {
  console.log('后置')
}
